package com.shuailee.study.basicknowledge.collectorstest;

import com.alibaba.fastjson.JSON;
import com.shuailee.study.model.Company;
import com.shuailee.study.model.User;
import org.assertj.core.util.Lists;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @program: study-javacore
 * @description: 流方法的使用
 * @author: shuai.li
 * @create: 2018-06-26 21:50
 **/
public class StreamsAPI {

    public static void main(String[] args) {

        list2mapTest ();


    }

    private static void list2mapTest() {
//            Collectors.toMap()
//            第一个参数：Person:getId表示选择Person的getId作为map的key值；
//            第二个参数：v->v表示选择将原来的对象作为Map的value值
//            第三个参数：(a,b)->a中，如果a与b的key值相同，选择a作为那个key所对应的value值，第一个就是忽略重复，如果选第二个值就是覆盖
//            Java 8允许在接口中加入具体方法。接口中的具体方法有两种，default方法和static方法，identity()就是Function接口的一个静态方法。
//            Function.identity()返回一个输出跟输入一样的Lambda表达式对象，等价于形如t -> t形式的Lambda表达式。
        List<Company> companies =getCompanyInfo();
        if(CollectionUtils.isNotEmpty(companies)){

            // 属性作为key,属性作为value
            System.out.println("********* 属性作为key,属性作为value");
            Map<String,List<User>> companyHashMap1 = companies.stream().collect(
                    Collectors.toMap(Company::getCompanyName, Company::getUsers));
            for (Map.Entry<String,List<User>> map:companyHashMap1.entrySet()) {
                System.out.println(MessageFormat.format("key:{0},value:{1}", map.getKey(), JSON.toJSON( map.getValue())));
            }

            // 属性作为key,属性作为value,对value进行二次加工
            System.out.println("********* 属性作为key,属性作为value,对value进行二次加工");
            Map<String,List<User>> companyHashMap2 = companies.stream().collect(
                    Collectors.toMap(Company::getCompanyName, c->{
                        c.getUsers().add(User.builder().user_id(6).build());
                        return c.getUsers();
                    }));
            for (Map.Entry<String,List<User>> map:companyHashMap2.entrySet()) {
                System.out.println(MessageFormat.format("key:{0},value:{1}", map.getKey(), JSON.toJSON( map.getValue())));
            }

            // 属性作为key 对象自身作为value，如果key重复忽略重复的key
            Map<String,Company> companyHashMap3 = companies.stream().collect(
                    Collectors.toMap(Company::getCompanyName, v->v,(a, b)->a)); // v->v 可以用Function.identity()代替
            System.out.println("********* 属性作为key 对象自身作为value，如果key重复忽略重复的key");
            for (Map.Entry<String,Company> map:companyHashMap3.entrySet()) {
                System.out.println(MessageFormat.format("key:{0},value:{1}", map.getKey(), JSON.toJSON( map.getValue())));
            }


            Map<String,String> companyHashMap4 = companies.stream().collect(
                    Collectors.toMap(Company::getCompanyName, v->v.getTel(),(a, b)->a+","+b));
            System.out.println("********* 属性作为key 属性作为value，如果key重复则拼接相同key的value");
            for (Map.Entry<String,String> map:companyHashMap4.entrySet()) {
                System.out.println(MessageFormat.format("key:{0},value:{1}", map.getKey(), JSON.toJSON( map.getValue())));
            }
        }
    }

    private static List<Company> getCompanyInfo() {
        User u1 =User.builder().user_id(1).user_name("u1").user_address("sh").build();
        User u2 = User.builder().user_id(2).user_name("u2").user_address("bj").build();
        User u3 = User.builder().user_id(3).user_name("u3").user_address("nj").build();
        Company company=Company.builder().companyName("A").tel("1311111111").users(Lists.newArrayList(u1,u2)).build();
        Company company2=Company.builder().companyName("B").tel("1312222222").users(Lists.newArrayList(u3)).build();
        Company company3=Company.builder().companyName("A").tel("1312222222").users(Lists.newArrayList(u1)).build();
        List<Company> companies= Lists.newArrayList(company,company2,company3);
        return companies;
    }


}
